package com.example.shop.redis.enums;

/**
 * key前缀：
 * 模块名:功能名:存放的值类型:
 */
public enum RedisKey {
//===============================|| 项目 ||====================================//
    /**
     * ip请求次数限制
     * 格式：
     * key                          value
     * IP_CURRENT_LIMIT + ip     请求次数(int)
     */
    IP_CURRENT_LIMIT("shop:request:time:"),
//=================================||  websocket  ||======================================//
    /**
     * websocket令牌key前缀
     * 注意：这里httpSessionId是指请求令牌时的sessionId
     * 而不是建立websocket的tcp连接时关联的httpSession的SessionId
     * 格式：
     * key                                                  value
     * USER_WEBSOCKET_TOKEN_REQ_SESSION + 令牌     请求令牌的httpSessionId(String)
     */
    USER_WEBSOCKET_TOKEN_REQ_SESSION("user:websocket:token:req:session:"),
    /**
     * websocket令牌key前缀
     * 注意：这里httpSessionId是指请求令牌时的sessionId
     * 而不是建立websocket的tcp连接时关联的httpSession的SessionId
     * 格式：
     * key                                                      value
     * MERCHANT_WEBSOCKET_TOKEN_REQ_SESSION + 令牌     请求令牌的httpSessionId(String)
     */
    MERCHANT_WEBSOCKET_TOKEN_REQ_SESSION("merchant:websocket:token:req:session:"),
//===============================|| 数据一致性 ||====================================//
    /**
     * redis的库存同步到mysql数据库和es中的键值对的key前缀
     * 用于保证将redis中的库存数据写入到mysql和es时，不能更改redis中的对应的库存数据
     * 格式：
     * key                              value
     * SYNC_ME_INVENTORY + 商品id       不限制(只判断该键的存在性，不获取值)
     */
    SYNC_ME_INVENTORY("sync:me:inventory:"),
//===============================|| user模块 ||====================================//

    /**
     * 登录验证码key前缀
     * 格式：
     * key                                 value
     * USER_LOGIN_CODE + 手机号/邮箱     授权码(String)
     */
    USER_LOGIN_CODE("user:authCode:login:"),
    /**
     * 绑定验证码key前缀
     * 格式：
     * key                                 value
     * USER_BIND_CODE + 手机号/邮箱     授权码(String)
     */
    USER_BIND_CODE("user:authCode:bind:"),
    /**
     * 解除绑定验证码key前缀
     * 格式：
     * key                                    value
     * USER_UNBIND_CODE + 手机号/邮箱     授权码(String)
     */
    USER_UNBIND_CODE("user:authCode:unbind:"),
    /**
     * 修改密码的授权码key前缀
     * 格式：
     * key                                           value
     * USER_CHANGE_PASSWORD_CODE + 手机号/邮箱     授权码(String)
     */
    USER_CHANGE_PASSWORD_CODE("user:authCode:changePassword:"),
    /**
     * 用户注销授权码的key前缀
     * 格式：
     * key                              value
     * CANCELLATION_CODE + 用户id     授权码(String)
     */
    CANCELLATION_CODE("user:authCode:cancellation:"),
    /**
     * 用户信息的key前缀
     * 格式：
     * key                          value
     * USER_INFO + 用户id         用户信息(User)
     */
    USER_INFO("user:info:"),
    /**
     *  用户id信息的key前缀
     * 格式：
     * key                              value
     * USER_ID + 非id的用户字段值          用户id(Long)
     */
    USER_ID("user:id:"),
//===============================|| merchant模块 ||====================================//
    /**
     * 商家信息的key前缀，后面只能跟商家id
     * 格式：
     * key                              value
     * MERCHANT_INFO + 商家id         商家信息(Merchant)
     */
    MERCHANT_INFO("merchant:info:"),
    /**
     * 商家id信息的key前缀，后跟非id的商家字段
     * 格式：
     * key                                  value
     * MERCHANT_ID + 非id的商家字段值       商家id(Long)
     */
    MERCHANT_ID("merchant:id:"),
    ;
    private String keyType;
    RedisKey(String keyType){
        this.keyType = keyType;
    }
    public String getKey(){
        return keyType;
    }
    @Override
    public String toString() {
        return keyType;
    }

    /**
     * hashMap
     * 下面枚举是key,field是其他指定值
     */
    public enum HashMap {
        /**
         * 用户登录所在的session会话key前缀
         * 代表该用户登录在哪个session上，即一个用户只能在一个session上登录，不能多端登录
         * 格式：
         * key                            field                value
         * USER_LOGIN_IN_SESSION_ID      用户id                 sessionId(String)
         */
        USER_LOGIN_IN_SESSION_ID("user:login:session"),
        /**
         * 商品库存key前缀
         * 格式：
         * key                              field                value
         * GOODS_INVENTORY + 商品id        商品款式名              库存量(int)
         */
        GOODS_INVENTORY("goods:inventory:")
        ;
        private String keyType;
        HashMap(String keyType){
            this.keyType = keyType;
        }
        public String getKey(){
            return keyType;
        }
        @Override
        public String toString() {
            return keyType;
        }
    }

    public enum ZRange{
        /**
         * 用户的商品爱好推荐key前缀
         * 格式：
         * key                                              value
         * USER_FOND_GOODS_RECOMMEND + 用户id         爱好推荐(GoodsTypeFondRatio)
         */
        USER_FOND_GOODS_RECOMMEND("user:fond:recommend:"),;
        private String keyType;
        ZRange(String keyType){
            this.keyType = keyType;
        }
        public String getKey(){
            return keyType;
        }
        @Override
        public String toString() {
            return keyType;
        }
    }
}
